package com.woniuxy.woniubook.service;

import com.woniuxy.woniubook.entity.Book;
import com.woniuxy.woniubook.entity.User;
import com.woniuxy.woniubook.mapper.BookMapper;
import com.woniuxy.woniubook.uitl.JSONUtils;
import com.woniuxy.woniubook.vo.CartItemVo;
import com.woniuxy.woniubook.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Service
public class CartService {

    @Autowired
    BookMapper bookMapper ;
    
    @Autowired
    RedisTemplate<String,Object> redisTemplate ;

    public String addToCart(User user,Long bookId){
        // 根据书籍的ID 查询到 书籍的对象
        Book book = bookMapper.selectById(bookId);
        //检测购物车中 有没有此商品 如果有 ，那么就不是新添加 必须在此商品上 购买数量+1 ，更新小计  如果没有 ，才是新添加
        String itemJson = (String) redisTemplate.opsForHash().get(user.getId() + "", bookId+"");

        if (itemJson == null) {
            CartItemVo cartItemVo = new CartItemVo();
            cartItemVo.setBookName(book.getName());
            cartItemVo.setBookId(book.getId());
            cartItemVo.setBookPrice(book.getPrice());
            cartItemVo.setBookSrc(book.getImgsrc());
            cartItemVo.setUserId(user.getId());
            cartItemVo.setBuyCount(1);
            cartItemVo.setSumPrice(book.getPrice()); // 绝对不行
            //cartItemVo 转成JSON
            String json = JSONUtils.createJson(cartItemVo);
            //存储到 redis中
            redisTemplate.opsForHash().put(user.getId()+"",bookId+"",json);
        }else {
            CartItemVo cartItemVo = JSONUtils.parseJson(itemJson,CartItemVo.class);
            //购物存在
            //1. 获取原来的购买数量
            int buyCount = cartItemVo.getBuyCount();
            cartItemVo.setBuyCount(buyCount+1);
            //2. 获取小计
            BigDecimal sumPrice = cartItemVo.getSumPrice();
            BigDecimal add = sumPrice.add(cartItemVo.getBookPrice().multiply(new BigDecimal("1")));
            cartItemVo.setSumPrice(add);

            String json = JSONUtils.createJson(cartItemVo);
            redisTemplate.opsForHash().put(user.getId()+"",bookId+"",json);
        }
        return  "ok";
    }

    public CartVo getMyCart(Long userId) {
        Map<Object, Object> entries = redisTemplate.opsForHash().entries(userId + "");
        CartVo cartVo = new CartVo();
        List<CartItemVo> lists = new ArrayList<>();
        BigDecimal all = new BigDecimal("0.0"); //总价格
        for (Map.Entry<Object, Object> en :entries.entrySet()) {
            String value = (String) en.getValue();  //item 的json
            CartItemVo cartItemVo = JSONUtils.parseJson(value, CartItemVo.class);
            lists.add(cartItemVo);
            all = all.add(cartItemVo.getSumPrice());
        }
        cartVo.setCarts(lists);
        cartVo.setSumPrice(all);
        return cartVo ;
    }


    public String modifyCount(Long userId, Long bookId, int bookCount) {
        String itemJson = (String) redisTemplate.opsForHash().get(userId + "", bookId + "");
        CartItemVo cartItemVo = JSONUtils.parseJson(itemJson, CartItemVo.class);
        cartItemVo.setBuyCount(bookCount);
        BigDecimal all = cartItemVo.getBookPrice().multiply(new BigDecimal(bookCount+""));
        cartItemVo.setSumPrice(all);

        String json = JSONUtils.createJson(cartItemVo);
        redisTemplate.opsForHash().put(userId+"",bookId+"",json);
        return "ok" ;
    }
}
